#include "../header.h"

//cid数组 : 存储每个客户端套接字的cid数值
int cidnum[20] = {0};
//cidflg ： 代表的是 当前系统有多少个人。
int cidflg = 0;

//静态 cid ; 
char bufs[128] = "";
char bufv[128] = "";
int len = 0 ;
void * pthread_fun(void * arg)
{
    //cid是从主线程传过来的。   
    int pcid = *(int *)arg;
    //清空bufs
    bzero(bufs,sizeof(bufs));
    bzero(bufv,sizeof(bufv));
    while(strncmp(bufs,"quit",4))
    {
        //cid 要传递过来
        bzero(bufs,sizeof(bufs));
        bzero(bufv,sizeof(bufv));
        len = recv(pcid,bufs,sizeof(bufs),0);
        //strncpy(bufv,bufs,strlen(bufs)-2);
        printf("客户端发送过来的数据是:%s len = %d\n",bufs,len);

        //在这里进行转发。
        int i = 0 ; 
        for(i = 0 ; i < cidflg ; i ++ )
        {
            //反弹 - 保存  - 打印 
            //数组没有链表灵活。最好后面做成链表。单向链表。
           if(cidnum[i] != pcid) //不用发给自己。
            send(cidnum[i],bufs,strlen(bufs),0);    
        } 
    }
    //线程退出 - cid关闭是不是一件事？
    shutdown(pcid,SHUT_RDWR);
    pcid = -1; 
    //线程退出
    pthread_exit((void *)0);
}

//多用户登录 - 并发服务器 - 线程方法
int main(int argc, char const *argv[])
{
    if(argc < 3)
    {
        perror("usage:./server ip port\n");
        return -1;
    }

    //.建立套接字
    int sid = socket(AF_INET,SOCK_STREAM,0);
    printf("sid = %d\n",sid);

    //实际地址结构体
    struct sockaddr_in saddr = {0};
    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = inet_addr(argv[1]);    
    saddr.sin_port = htons(atoi(argv[2]));
    if(bind(sid,(struct sockaddr*)&saddr,sizeof(saddr))<0)
    {
        perror("bind error\n");
        return -2;
    }
    printf("bind successful\n");

    //3.监听
    listen(sid,10);

    //4.循环连接
    char bufs[128] = "";
    int len = 0 ;
    pthread_t tid = 0 ;
    //只要初始化一次，在全局数据区
    static int cid = -1;
    while (1)
    {   //主线程。  链接。
        cid = accept(sid,NULL,NULL);
        cidnum[cidflg] = cid;
        if(cid != -1)
        {   
            //把线程设定成分离属性 - 线程执行完毕以后，自动释放占用的空间。
            pthread_create(&tid,NULL,pthread_fun,&cidnum[cidflg]);
            pthread_detach(tid);
            printf("有新用户登录 cid = %d\n",cidnum[cidflg]);
            //最后加加。
            cidflg++;
        }
       
    }
    return 0;
    
}
